乱码
先看一个简单的例子:
|
|
当访问时界面输出乱码,这主要是因为程序用UTF-8编码,而浏览器默认采用GBK解码。
其实乱码问题出现的根本原因也就是编码和解码不一致产生的。
常见的编码
- UTF-8:国际编码
- GBK:中文编码,是GB2312的扩展,除了兼容GB2312外,还能显示繁体中文、还有日文的假名
- ISO8859-1:tomcat默认,不支持中文
通过浏览器调用Servlet,页面显示乱码
response乱码
解决方法:response.setContentType("text/html;charset=utf-8");
或者response.setHeader("content-type", "text/html;charset=utf-8");
原理:告诉浏览器用utf-8进行解析。
看下面两种情况:
情况一
问题代码如下:
123OutputStream out = response.getOutputStream();String data = "博客";out.write(data.getBytes("UTF-8"));乱码流程图
解决方案流程图
情况二
问题代码如下:
12345protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter();String data = "博客";out.println(data);}浏览器输出的结果为??
这是因为“博客”首先被封装在response对象中,因为IE和WEB服务器之间不能传输文本,然后就通过ISO-8859-1编码进行编码,但是ISO-8859-1中没有“博客”的编码,因此输出“??”,表示没有编码。
错误代码流程图
解决方案流程图
request乱码问题
POST请求
乱码流程图
解决方案
GET请求
问题本质是get方式传递的参数内容默认编码方式为ISO-8895-1,而且使用request.setCharacterEncoding(“utf-8”)也无法解决问题,现提供一种解决方法如下:
1String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8");即先将字符串用ISO-8859-1编码成字节数组,然后用UTF-8编码将字节数组转换成字符串输出。
流程图如下:
参考
本文主要图片和内容来自博客。